package com.syf.starter.soa.protocol.handle;

import cn.hutool.core.util.StrUtil;
import com.syf.kit.soa.core.SyfRpcMsg;
import com.syf.kit.soa.core.SyfSOAProtocolCont;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import lombok.extern.slf4j.Slf4j;

/**
 * 处理魔数匹配和心跳请求
 * */
@Slf4j
public class RpcBasicHandler extends SimpleChannelInboundHandler<SyfRpcMsg> {
    private static final String PONG_RESP = "pong";

    private String magicNum;

    public RpcBasicHandler(String magicNum) {
        super();
        this.magicNum = magicNum;
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, SyfRpcMsg syfRpcMsg) throws Exception {
        // 模数匹配
        if (!StrUtil.equals(magicNum, syfRpcMsg.getMagicNum())) {
            log.warn("收到非法魔数的请求，关闭本次连接");
            ctx.close();
            return;
        }

        // 处理心跳请求
        if (syfRpcMsg.getReqType() == SyfSOAProtocolCont.BEAT_REQ_TYPE) {
            // ChannelHandlerContext.writeAndFlush 链路从当前就已中止
            syfRpcMsg.setBizData(PONG_RESP);
            ctx.writeAndFlush(syfRpcMsg);
            return;
        }

        // 其他请求交给后面的handle处理
        ctx.fireChannelRead(syfRpcMsg);
    }
}
